package mail

import (
	"html/template"
	"os"
	"path/filepath"
	"strings"
	"sync"

	"gitee.com/huangxinbo/xcas/internal/config"
	"gitee.com/huangxinbo/xcas/pkg/i18n"
	"gitee.com/huangxinbo/xcas/pkg/logger"
	"go.uber.org/zap"
)

// MailRenderer 邮件模板渲染器
type Templates struct {
	templatesDir string
	layout       string
	i18n         *i18n.I18n
	logger       *logger.Logger
	config       *config.Config

	// 缓存已解析的模板
	templates     map[string]*template.Template
	templatesLock sync.RWMutex
}

// NewMailRenderer 创建新的邮件模板渲染器
func NewMailTemplates(logger *logger.Logger, config *config.Config, i18n *i18n.I18n) *Templates {
	return &Templates{
		templatesDir: "mail_templates",
		layout:       "layout.html",
		i18n:         i18n,
		logger:       logger,
		config:       config,
		templates:    make(map[string]*template.Template),
	}
}

// getTemplateFuncs 获取模板函数映射
func (r *Templates) getTemplateFuncs() template.FuncMap {
	return template.FuncMap{
		// T 函数：简单的国际化翻译
		"T": func(key string) string {
			if r.i18n != nil {
				return r.i18n.T(key)
			}
			return key
		},
		// TWithData 函数：带数据的国际化翻译
		"TWithData": func(key string, data any) string {
			if r.i18n != nil {
				return r.i18n.TWithData(key, data)
			}
			return key
		},
		// TWithLocale 函数：指定语言的国际化翻译
		"TWithLocale": func(locale, key string) string {
			if r.i18n != nil {
				originalLocale := r.i18n.Locale
				r.i18n.Locale = locale
				result := r.i18n.T(key)
				r.i18n.Locale = originalLocale
				return result
			}
			return key
		},
		// TWithLocaleAndData 函数：指定语言和数据的国际化翻译
		"TWithLocaleAndData": func(locale, key string, data any) string {
			if r.i18n != nil {
				originalLocale := r.i18n.Locale
				r.i18n.Locale = locale
				result := r.i18n.TWithData(key, data)
				r.i18n.Locale = originalLocale
				return result
			}
			return key
		},
	}
}

// parseTemplate 解析模板文件
func (r *Templates) parseTemplate(templateName string) (*template.Template, error) {
	// 检查缓存中是否已有模板
	r.templatesLock.RLock()
	if tmpl, exists := r.templates[templateName]; exists {
		r.templatesLock.RUnlock()
		return tmpl, nil
	}
	r.templatesLock.RUnlock()

	// 获取模板函数
	funcs := r.getTemplateFuncs()

	// 解析布局模板和内容模板
	layoutPath := filepath.Join(r.templatesDir, r.layout)
	contentPath := filepath.Join(r.templatesDir, templateName)

	// 创建新的模板并解析布局
	tmpl := template.New("layout").Funcs(funcs)
	if _, err := tmpl.ParseFiles(layoutPath); err != nil {
		return nil, err
	}

	// 解析内容模板
	if _, err := tmpl.ParseFiles(contentPath); err != nil {
		return nil, err
	}

	// 将解析后的模板存入缓存
	r.templatesLock.Lock()
	r.templates[templateName] = tmpl
	r.templatesLock.Unlock()

	return tmpl, nil
}

// GetTemplates 获取可用的模板列表
func (r *Templates) GetTemplates() {
	// 读取模板目录
	entries, err := os.ReadDir(r.templatesDir)
	if err != nil {
		r.logger.Error("Failed to read templates directory",
			zap.String("directory", r.templatesDir),
			zap.Error(err))
	}

	for _, entry := range entries {
		// 只处理 .html 文件，排除 layout.html 布局模板
		if !entry.IsDir() && strings.HasSuffix(entry.Name(), ".html") && entry.Name() != r.layout {
			tmpl, err := r.parseTemplate(entry.Name())
			if err != nil {
				r.logger.Error("Failed to parse template",
					zap.String("template", entry.Name()),
					zap.Error(err))
			}
			r.templates[entry.Name()] = tmpl
		}
	}
}
